#include<iostream>
#include<sys/types.h>  
#include<sys/socket.h> 
#include<string>
#include<strings.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<cstdlib>
#include<unistd.h>

using namespace std;

void Usage(std::string proc)
{
    std::cout<<"\nUsage:"<<proc<<"serverip serverprot"<<std::endl;
}

//./udp_client serverip serverprot
int main(int argc,char* argv[])
{
    if(argc!=3){
        std::cout<<"\nUsage:"<<argv[0]<<"serverip serverprot"<<std::endl;
        exit(0);
    }
    std::string serverip=argv[1]; //从命令行参数中拿到服务器的ip地址
    uint16_t serverport=stoi(argv[2]);//从命令行参数中拿到服务器的端口号

    //存放要连接的服务器的IP地址、端口号
    struct sockaddr_in server;
    bzero(&server,sizeof(server));//先清零，以免server中的随机数据影响后续操作
    server.sin_family=AF_INET;    //表示该UDP套接字是用来跨网络通信的
    server.sin_port=htons(serverport);//服务器端口号，主机字节序 转 网络字节序
    server.sin_addr.s_addr=inet_addr(serverip.c_str()); //服务器的ip地址，主机字节序————>网络字节序 && 字符串————>整型

    //1.客户端创建套接字
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    //2.向服务器发起连接请求
    connect(sockfd,(struct sockaddr*)&server,sizeof(server));

    string messege;//存放客户端要给服务器发送的数据
    char buffer[1024];//存放服务器给客户端的响应结果
    while(true)
    {
        cout<<"Please Enter@";
        getline(cin,messege); //要给服务器发送的数据

        //1.发messege中的数据  2.发给服务器，即server
        int ret=sendto(sockfd,messege.c_str(),messege.size(),0,(const struct sockaddr*)&server,sizeof(server));
        if(ret<0) 
        {
            cout<<"-1"<<endl;
            break;
        }
        else if(ret==0){
            cout<<"server exit,me too!"<<endl;
            break;
        }

        struct sockaddr_in temp;
        socklen_t len=sizeof(temp);
        //接收服务器的响应
        ssize_t s=recvfrom(sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&temp,&len);
        if(s>0){
            buffer[s]='\0';
            cout<<buffer<<endl;//把服务器响应回来的数据打印出来
        }
        else if(s==0){
            cout<<"server exit,me too!"<<endl;
            break;
        }
    }

    close(sockfd);

    return 0;
}